package model;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

// 通过这个类，封装针对 博客表 的基本操作
// 暂不涉及到修改操作，可以通过删除，再新增的方式修改
public class BlogDao {

    // 1.新增一个博客
    public void add(Blog blog) {

        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // 1.和数据库建立连接
            connection = DBUtil.getConnection();
            // 2.构造 sql 语句
            // 注意是插入表中数据，不是数据库名字
            //String sql = "insert into blog_system values(null,?,?,?,?)";
            String sql = "insert into blog values(null,?,?,?,?)";
            statement = connection.prepareStatement(sql);
            statement.setString(1,blog.getTitle());
            statement.setString(2,blog.getContent());
            //statement.setTimestamp(3,blog.getPostTimeTamp());
            statement.setString(3,blog.getPostTime());
            statement.setInt(4,blog.getUserId());

            // 3.执行 sql语句
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 4.释放连接，关闭资源
            DBUtil.close(connection,statement,null);
        }
    }

    // 2.根据博客id 来查询指定博客（博客详情页中）
    public Blog selectById(int blogId) {
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        Blog blog = new Blog();
        try {
            // 1. 和数据库建立连接
            connection = DBUtil.getConnection();
            // 2.构造sql
            String sql = "select * from blog where blogId = ?";
            statement = connection.prepareStatement(sql);
            statement.setInt(1,blogId);
            // 3.执行 sql 语句
            // 注意执行顺序不要错误，不然会错误执行
            resultSet = statement.executeQuery();
            //statement.setInt(1,blogId);


            // 4.遍历结果集合
            // 遍历结果集合. 由于 blogId 在 blog 表中是唯一的. (主键)
            // 此时的查询结果, 要么是没有查到任何数据, 要么只有一条记录!!
            // 此处可以不使用 while, 直接 if 判定即可.
            if(resultSet.next()) {
                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                blog.setContent(resultSet.getString("content"));
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                blog.setUserId(resultSet.getInt("userId"));
                return blog;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 4.释放资源，关闭连接
            DBUtil.close(connection,statement,resultSet);
        }
        return null;
    }

    // 3.查询出数据库中所有的博客，用于博客列表页
    public List<Blog> selectAll() {
        List<Blog> blogList = new ArrayList<>();
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            // 1. 和数据库建立连接
            connection = DBUtil.getConnection();
            // 2.构造sql
            // 在此处加上 order by 进行降序排序，保证最新的博客是在最上面，
            // 换言之不加order by的时候，不一定保证发布最久的博客就是在最上面，所以我们手动加上order by最好
            String sql = "select * from blog order by postTime desc";
            statement = connection.prepareStatement(sql);
            // 3.执行 sql 语句
            resultSet = statement.executeQuery();
            // 4.遍历结果集合
            // 遍历结果集合. 由于 blogId 在 blog 表中是唯一的. (主键)
            // 此时的查询结果, 要么是没有查到任何数据, 要么只有一条记录!!
            // 此处可以不使用 while, 直接 if 判定即可.
            while(resultSet.next()) {
                Blog blog = new Blog();
                blog.setBlogId(resultSet.getInt("blogId"));
                blog.setTitle(resultSet.getString("title"));
                // 注意这里的正文!!! 在博客列表页中, 不需要把整个正文内容都显示出来!!
                String content = resultSet.getString("content");
                if (content == null) {
                    content = "";
                }

                if(content.length() >= 100) {
                    // 这是一个截取的方法，不要忘了
                    content = content.substring(0,100) + "...";
                }
                blog.setContent(content);
                blog.setPostTime(resultSet.getTimestamp("postTime"));
                blog.setUserId(resultSet.getInt("userId"));
                blogList.add(blog);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 4.释放资源，关闭连接
            DBUtil.close(connection,statement,resultSet);
        }
        return blogList;
    }

    // 4.删除指定博客
    public void delete(int blogId) {
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            // 1.和数据库建立连接
            connection = DBUtil.getConnection();
            // 2.构造 sql 语句
            String sql = "delete from blog where blogId = ?";
            statement = connection.prepareStatement(sql);
            statement.setInt(1,blogId);

            // 3.执行 sql语句
            statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 4.释放连接，关闭资源
            DBUtil.close(connection,statement,null);
        }
    }
}
